

<!DOCTYPE html>
<html lang="zh-CN" data-default-color-scheme=&#34;auto&#34;>



<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/img/2.jpg">
  <link rel="icon" type="image/png" href="/img/2.jpg">
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#2f4154">
  <meta name="description" content="">
  <meta name="author" content="K">
  <meta name="keywords" content="">
  <title>docker核心原理 - K</title>

  <link  rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.4.1/css/bootstrap.min.css" />


  <link  rel="stylesheet" href="https://cdn.staticfile.org/github-markdown-css/4.0.0/github-markdown.min.css" />
  <link  rel="stylesheet" href="/lib/hint/hint.min.css" />

  
    
    
      
      <link  rel="stylesheet" href="https://cdn.staticfile.org/highlight.js/10.0.0/styles/github-gist.min.css" />
    
  

  


<!-- 主题依赖的图标库，不要自行修改 -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_ba1fz6golrf.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_kmeydafke9r.css">


<link  rel="stylesheet" href="/css/main.css" />

<!-- 自定义样式保持在最底部 -->


  <script  src="/js/utils.js" ></script>
  <script  src="/js/color-schema.js" ></script>
<meta name="generator" content="Hexo 5.2.0"></head>


<body>
  <header style="height: 70vh;">
    <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand"
       href="/">&nbsp;<strong>かい</strong>&nbsp;</a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/">
                <i class="iconfont icon-home-fill"></i>
                首页
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/archives/">
                <i class="iconfont icon-archive-fill"></i>
                归档
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/categories/">
                <i class="iconfont icon-category-fill"></i>
                分类
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/tags/">
                <i class="iconfont icon-tags-fill"></i>
                标签
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/about/">
                <i class="iconfont icon-user-fill"></i>
                关于
              </a>
            </li>
          
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" data-toggle="modal" data-target="#modalSearch">&nbsp;<i
                class="iconfont icon-search"></i>&nbsp;</a>
          </li>
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" href="javascript:">&nbsp;<i
                class="iconfont icon-dark" id="color-toggle-icon"></i>&nbsp;</a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

    <div class="banner intro-2" id="background" parallax=true
         style="background: url('/img/1.jpg') no-repeat center center;
           background-size: cover;">
      <div class="full-bg-img">
        <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
          <div class="container page-header text-center fade-in-up">
            <span class="h2" id="subtitle">
              
            </span>

            
              <div class="mt-3">
  
  
    <span class="post-meta">
      <i class="iconfont icon-date-fill" aria-hidden="true"></i>
      <time datetime="2020-12-01 14:00" pubdate>
        2020年12月1日 下午
      </time>
    </span>
  
</div>

<div class="mt-1">
  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-chart"></i>
      2.5k 字
    </span>
  

  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-clock-fill"></i>
      
      
      30
       分钟
    </span>
  

  
  
</div>

            
          </div>

          
        </div>
      </div>
    </div>
  </header>

  <main>
    
      

<div class="container-fluid">
  <div class="row">
    <div class="d-none d-lg-block col-lg-2"></div>
    <div class="col-lg-8 nopadding-md">
      <div class="container nopadding-md" id="board-ctn">
        <div class="py-5" id="board">
          <article class="post-content mx-auto" id="post">
            <!-- SEO header -->
            <h1 style="display: none">docker核心原理</h1>
            
            <div class="markdown-body" id="post-body">
               <!-- 
 完全解耦
 - 上图中的 app-a 和 app-b app-c 是相互独立的三个系统，每个系统都自己用自己的lib库以及/bin目录命令等

 - HostOS通过 Hypervisor对硬件进行虚拟化，也就是虚拟机模拟硬件
 - 在这之上再次创建系统,运行软件等 
  半解耦
  - HostOS通过运行Docker程序进行虚拟化
 - 所有的Docker容器的硬件是和物理机参数完全一样的，物理机是1G，那么容器也是1G
 - 在Docker虚拟化之上，每个app都共用一套硬件和其他相同的系统文件，如果有app需要用到别的lib库，该app重新安装新的lib库 -->
<h2 id="Namespace命名空间"><a href="#Namespace命名空间" class="headerlink" title="Namespace命名空间"></a>Namespace命名空间</h2><ul>
<li>Docker的运行和命名空间有着密切的联系，Docker中每一个容器都有一个独立的位置</li>
<li>容器在运行时，就会在一个空间内，也就是说每个docker容器就是一个单独的空间</li>
</ul>
<h2 id="容器的概念"><a href="#容器的概念" class="headerlink" title="容器的概念"></a>容器的概念</h2><ul>
<li><p>容器是一个大的分类，和操作系统一样，有许多的系统，Docker是容器中的一种</p>
</li>
<li><p>虽然容器是一个大的种类，但是通过容器对容器镜像实例化后也称之为容器</p>
</li>
<li><p>容器主要分为 Docker Podman coreOS lxc buildah skopo等</p>
</li>
<li><p>Podman</p>
<ul>
<li>是红帽公司收购的，基于redhat_linux之上，可以yum直接安装<pre><code class="hljs cmake">yum -y <span class="hljs-keyword">install</span> podman</code></pre></li>
<li>使用方法</li>
<li>和docker基本相同<pre><code class="hljs dockerfile">podman pull centos <span class="hljs-comment"># 从红帽仓库下载centos镜像 </span>
podman images <span class="hljs-comment"># 查看已有镜像</span>
podman <span class="hljs-keyword">run</span><span class="bash"> -it --name <span class="hljs-built_in">test</span> centos /bin/bash  <span class="hljs-comment"># 运行并进入容器</span></span>
podman rm -f test <span class="hljs-comment"># 删除test容器</span>
podman ps <span class="hljs-comment"># 查看正在运行的容器</span></code></pre>
<h2 id="docker镜像的分类"><a href="#docker镜像的分类" class="headerlink" title="docker镜像的分类"></a>docker镜像的分类</h2></li>
</ul>
</li>
<li><p>应用类镜像，操作系统类镜像，工具类镜像</p>
<blockquote>
<p>httpd就是工具类镜像<br>centos是系统类镜像<br>busybox是工具类镜像</p>
</blockquote>
</li>
</ul>
<h2 id="虚拟化的分类"><a href="#虚拟化的分类" class="headerlink" title="虚拟化的分类"></a>虚拟化的分类</h2><ul>
<li>分为半解耦和完全解耦</li>
</ul>
<p><img src="/images/docker/xt.png" srcset="/img/loading.gif"></p>
<ul>
<li><p>系统命令的是如何运作的</p>
<blockquote>
<p>首先user下达指令去操作shell<br>shell通过调用system进程通过调用lib库的文件去操控软件进程<br>软件通过系统驱动调用内核<br>内核直接调用硬件，所以用户的命令下达到了硬件，做出了相应的工作</p>
</blockquote>
</li>
<li><p>这里的驱动程序和lib库文件起到了关键的作用</p>
<ul>
<li>每个硬件都有驱动程序，无论是u盘还是鼠标等，要发挥出硬件的性能，就需要驱动的支持，如果没有驱动，那么硬件有可能不会工作</li>
<li>lib 也叫库文件，该文件写入了各种各样的程序说明信号，用来告诉系统某一个软件的操作</li>
</ul>
</li>
<li><p>对于虚拟化来说硬件是相同的，所以驱动程序是可以通用的，库文件也有一定的通用性，比如一些服务的启动命令都是一样的</p>
</li>
<li><p>耦合:</p>
<ul>
<li>耦合就是两个或者两个以上的程序因为互相的作用而影响彼此，比如端口号相同就是耦合，也就是冲突</li>
</ul>
</li>
<li><p>因为同一个程序运行在一个系统中会有耦合，所以要解耦</p>
</li>
</ul>
<h2 id="完全解耦化"><a href="#完全解耦化" class="headerlink" title="完全解耦化"></a>完全解耦化</h2><ul>
<li><p>例如 VMware KVM等这些软件使用的都是完全解耦虚拟化<br><img src="/images/docker/wqjo.png" srcset="/img/loading.gif"></p>
</li>
<li><p>完美的没有任何冲突的</p>
</li>
<li><p>当我们在同一个操作系统中运行相同的软件程序时，它们会发生冲突。解除耦合则是为一个软件分配一个环境，使其独立运行。</p>
</li>
<li><p>例如</p>
<blockquote>
<p>手机里的应用分身，还有经常使用的VMware虚拟机也是使用这种方式</p>
</blockquote>
</li>
<li><p>当我们想要同时运行多个web服务器时，需要创建两个操作系统</p>
</li>
<li><p>从指定硬件层面（CPU、MEM、DISK）→安装内核→安装系统→安装lib库→安装service（驱动程序）→安装应用软件</p>
</li>
<li><p>每个系统之间都是互相独立的</p>
</li>
</ul>
<h2 id="半解耦化"><a href="#半解耦化" class="headerlink" title="半解耦化"></a>半解耦化</h2><p><img src="/images/docker/bjo.png" srcset="/img/loading.gif"></p>
<ul>
<li><p>使同一个环境下可以同时运行两个相同的软件，分担软件服务器的压力。<br>直接使用物理机上的硬件资源（CPU、MEM、DISK）和kernel(内核)</p>
</li>
<li><p>例如：</p>
<blockquote>
<p>docker会直接使用系统镜像构建出一个容器，以文件夹的方式存放在操作系统上。<br>而容器内部的运行环境比如lib库将通过ln -s(软链接)的形式使用。<br>这样使得应用程序误以为一个文件夹就是一个操作系统。</p>
</blockquote>
</li>
</ul>
<h2 id="区别"><a href="#区别" class="headerlink" title="区别"></a>区别</h2><ul>
<li><p>半解耦是每个系统之间能共用的共用，确保容器体积会比虚拟机小很多，app只需要在安装时安装自己对应的lib库，bin指令集即可</p>
</li>
<li><p>完全解耦是每运行一个操作系统都需要重新启动和加载其他系统文件，每个系统之间的文件是相互独立的</p>
</li>
<li><p>如果当web访问量变大，需要多开几台web应用来缓解时，半解耦只需要在当前服务启动容器即可，不需要去启动操作系统，容器中的web应用会在沙盒运行，而完全解耦需要再启动一台虚拟机，也就相当于再次启动一台系统，在去运行web，运行完成后比半解耦慢很多</p>
</li>
</ul>
<h2 id="Docker的特性"><a href="#Docker的特性" class="headerlink" title="Docker的特性"></a>Docker的特性</h2><ul>
<li><p>容器具备了超强的可移植性</p>
</li>
<li><p>打包对象，任何软件以及依赖都可以打包在一起</p>
</li>
<li><p>解决硬件的依赖关系，容器不需要更改就几乎可以运行在所有的平台上</p>
</li>
<li><p>隔离性，资源，网络，库都是被隔离的，不会出现依赖问题</p>
</li>
<li><p>自动化，提供了标准为操作内容 可以快速的启动和迁移</p>
</li>
<li><p>容器意味着，环境隔离和可重复性：开发人员只需要为应用创建一次运行环境，打包为容器，便可以在任何电脑上使用，容器环境与其他host主机环境是隔离的，运维人员只需要配置好标准的环境，更加高效，一致和可重复性。容器消除了开发，测试，生产环境当中的不一致性</p>
</li>
</ul>
<h2 id="docker的隔离"><a href="#docker的隔离" class="headerlink" title="docker的隔离"></a>docker的隔离</h2><ul>
<li><p>隔离的本质：不在统一的范围</p>
<blockquote>
<p>ipc 信号量 消息队列和共享内存<br>mnt 挂载点和文件系统<br>net 网络设备，网站，端口<br>pid 进程编号<br>user 用户和组<br>uts 主机名和域名</p>
</blockquote>
</li>
<li><p>上面这些只要app之间有一项不同就说明已经隔离了</p>
</li>
<li><p>uts 和 ipc隔离</p>
<ul>
<li>容器之间主机名的不同来进行隔离</li>
<li>容器之间的pic消息队列的不同进行隔离</li>
</ul>
</li>
<li><p>pid隔离</p>
<ul>
<li><p>说到pid隔离，也就说到docker的一个bug了</p>
</li>
<li><p>不同空间的的进程可以有相同的pid号，系统中的第一个pid编号一定是1，也就是第一个进程pid号一定是1</p>
</li>
<li><p>在linux中第一个进程是 init进程，版本不同，也有可能是systemd进程，而其他进程都是该进程的子进程</p>
</li>
<li><p>在docker中第一个进程是我们进入docker时运行的命令，这是目前还没有解决的问题</p>
</li>
<li><p>如果需要pid的1号为 systemd的话需要进行提权操作，不过这个操作不建议</p>
<pre><code class="hljs jboss-cli">docker run <span class="hljs-params">--restart</span> always -d <span class="hljs-params">--name</span> test4 <span class="hljs-params">--privileged</span> centos <span class="hljs-string">/sbin/init</span> <span class="hljs-comment"># /sbin/init 就是1号进程  --privileged 就是提权</span></code></pre></li>
</ul>
</li>
<li><p>net隔离</p>
<ul>
<li><p>当物理机已经运行一个apache进程时，再进入命名空间去运行一个apache，会报出端口被占用的错误，就需要进行网络隔离</p>
</li>
<li><p>NET网络隔离包括了设备，ipv4/ipv6协议栈，防火墙，路由表、端口、socket等。</p>
</li>
<li><p>物理的网络设备最多存在一个net命名空间中，可以通过虚拟网络端对端，</p>
</li>
<li><p>不同的net命名空间创建通道，达到网络通讯的目的</p>
</li>
<li><p>如果有多块网卡，可以将网卡分配给新建net命名空间，当net命名空间被释放时，所有的内部进程都会中止，物理网卡就会返回到root的命名空间中</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>创建网络空间</p>
</blockquote>
<pre><code class="hljs routeros"><span class="hljs-comment"># 创建test_ns的network命名空间</span>
[root@localhost ~]#<span class="hljs-built_in"> ip </span>netns <span class="hljs-builtin-name">add</span> test_ns  

<span class="hljs-comment"># 查看test_ns中的网卡，只有一个lo网卡，且状态为DOWN</span>
[root@localhost ~]#<span class="hljs-built_in"> ip </span>netns exec test_ns<span class="hljs-built_in"> ip </span>link list
1: lo: &lt;LOOPBACK&gt; mtu 65536 qdisc noop state DOWN mode<span class="hljs-built_in"> DEFAULT group default </span>qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

<span class="hljs-comment"># lo的DOWN状态下是无法进行iso封装数据的 </span>
[root@localhost ~]#<span class="hljs-built_in"> ip </span>netns exec test_ns<span class="hljs-built_in"> ping </span>127.0.0.1
connect:<span class="hljs-built_in"> Network </span>is unreachable # 因为没有开启lo网卡

<span class="hljs-comment"># 开启lo网卡并ping自己测试</span>
[root@localhost ~]#<span class="hljs-built_in"> ip </span>netns exec test_ns<span class="hljs-built_in"> ip </span>link <span class="hljs-builtin-name">set</span> dev lo up
[root@localhost ~]#<span class="hljs-built_in"> ip </span>netns exec test_ns<span class="hljs-built_in"> ping </span>127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes <span class="hljs-keyword">from</span> 127.0.0.1: <span class="hljs-attribute">icmp_seq</span>=1 <span class="hljs-attribute">ttl</span>=64 <span class="hljs-attribute">time</span>=0.161 ms</code></pre>
<blockquote>
<p>为网络空间添加网卡</p>
</blockquote>
<pre><code class="hljs routeros"><span class="hljs-comment"># 添加 veth0 和veth1  类型是 veth peer类型</span>
[root@localhost ~]#<span class="hljs-built_in"> ip </span>link <span class="hljs-builtin-name">add</span> veth0<span class="hljs-built_in"> type </span>veth<span class="hljs-built_in"> peer </span>name veth1

<span class="hljs-comment"># 宿主机的网卡编号是全局的，无论哪个空间编号不会重复</span>
[root@localhost ~]#<span class="hljs-built_in"> ip </span>a 
12: veth1@veth0: &lt;BROADCAST,MULTICAST,M-DOWN&gt; mtu 1500 qdisc noop state DOWN<span class="hljs-built_in"> group default </span>qlen 1000
    link/ether 3a:3e:0e:0a:1f:bf brd ff:ff:ff:ff:ff:ff
13: veth0@veth1: &lt;BROADCAST,MULTICAST,M-DOWN&gt; mtu 1500 qdisc noop state DOWN<span class="hljs-built_in"> group default </span>qlen 1000
    link/ether 56:83:20:7a:c5:3a brd ff:ff:ff:ff:ff:ff
[root@localhost ~]#<span class="hljs-built_in"> ip </span>link <span class="hljs-builtin-name">set</span> veth1 netns test_ns  # 将veth1放入test_ns命名空间
[root@localhost ~]#<span class="hljs-built_in"> ip </span>netns exec test_ns<span class="hljs-built_in"> ip </span>a
1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN<span class="hljs-built_in"> group default </span>qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
12: veth1@if13: &lt;BROADCAST,MULTICAST&gt; mtu 1500 qdisc noop state DOWN<span class="hljs-built_in"> group default </span>qlen 1000
    link/ether be:a8:bd:76:bd:71 brd ff:ff:ff:ff:ff:ff link-netnsid 0</code></pre>
<blockquote>
<p>配置ip地址</p>
</blockquote>
<pre><code class="hljs routeros"><span class="hljs-comment"># 为test_ns中的veth1配置ip为10.1.1.1，并启动</span>
[root@localhost ~]#<span class="hljs-built_in"> ip </span>netns exec test_ns ifconfig veth1 10.1.1.1/24 up

<span class="hljs-comment"># 网络设备对的另一个配置ip，作为和网络命名空间网桥地址</span>
[root@localhost ~]# ifconfig veth0 10.1.1.2/24

<span class="hljs-comment"># ping test_ns命名空间</span>
[root@localhost ~]#<span class="hljs-built_in"> ping </span>10.1.1.1 

<span class="hljs-comment"># ping当前命名空间</span>
[root@localhost ~]#<span class="hljs-built_in"> ip </span>netns exec test_ns<span class="hljs-built_in"> ping </span>10.1.1.2 

<span class="hljs-comment"># 查看现有的网络命名空间</span>
[root@localhost ~]#<span class="hljs-built_in"> ip </span>netns 
test_ns (id: 1)</code></pre>
<ul>
<li>概念<ul>
<li>数据想要联通，用网线传输数据，网线一端是veth（虚拟以太网卡），另一端peer，一个peer只能插一个veth，</li>
<li>peer都插在交换机上，交换机负责转发数据</li>
</ul>
</li>
</ul>
<h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul>
<li><p>隔离没有写的太明白<br><a target="_blank" rel="noopener" href="https://www.feiyiblog.com/2020/03/25/Docker%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%AE%B9%E5%99%A8%E9%9A%94%E7%A6%BB%E7%9A%84/">https://www.feiyiblog.com/2020/03/25/Docker是如何实现容器隔离的/</a></p>
</li>
<li><p>参考该博客</p>
</li>
<li><p>pid隔离后 会有一个 1号进程的问题和物理机的pid是想通的，没有实现隔离，需要将容器和主机进行mount隔离</p>
</li>
</ul>

            </div>
            <hr>
            <div>
              <div class="post-metas mb-3">
                
                  <div class="post-meta mr-3">
                    <i class="iconfont icon-category"></i>
                    
                      <a class="hover-with-bg" href="/categories/docker/">docker</a>
                    
                  </div>
                
                
                  <div class="post-meta">
                    <i class="iconfont icon-tags"></i>
                    
                      <a class="hover-with-bg" href="/tags/docker/">docker</a>
                    
                  </div>
                
              </div>
              
                <p class="note note-warning">本博客所有文章是以学习为目的，如果有不对的地方可以一起交流沟通共同学习 邮箱:1248287831@qq.com！</p>
              
              
                <div class="post-prevnext row">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/2020/12/02/dockerPID%E9%9A%94%E7%A6%BB%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">docker核心原理-PID隔离问题解决_通过ssh连接容器</span>
                        <span class="visible-mobile">上一篇</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                      <a href="/2020/11/30/docker%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85/">
                        <span class="hidden-mobile">docker-环境安装-基础命令</span>
                        <span class="visible-mobile">下一篇</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </article>
                </div>
              
            </div>

            
          </article>
        </div>
      </div>
    </div>
    
      <div class="d-none d-lg-block col-lg-2 toc-container" id="toc-ctn">
        <div id="toc">
  <p class="toc-header"><i class="iconfont icon-list"></i>&nbsp;目录</p>
  <div id="tocbot"></div>
</div>

      </div>
    
  </div>
</div>

<!-- Custom -->


    
  </main>

  
    <a id="scroll-top-button" href="#" role="button">
      <i class="iconfont icon-arrowup" aria-hidden="true"></i>
    </a>
  

  
    <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">搜索</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v"
                 for="local-search-input">关键词</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>
  

  

  <footer class="text-center mt-5 py-3">
  <div class="footer-content">
     <a href="https://space.bilibili.com/39165374" target="_blank" rel="nofollow noopener"><span>LMK</span></a> <i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>Fluid</span></a> 
  </div>
  
  <div class="statistics">
    
    

    
      
        <!-- 不蒜子统计PV -->
        <span id="busuanzi_container_site_pv" style="display: none">
            总访问量 
            <span id="busuanzi_value_site_pv"></span>
             次
          </span>
      
      
        <!-- 不蒜子统计UV -->
        <span id="busuanzi_container_site_uv" style="display: none">
            总访客数 
            <span id="busuanzi_value_site_uv"></span>
             人
          </span>
      
    
  </div>


  

  
</footer>

<!-- SCRIPTS -->
<script  src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js" ></script>
<script  src="https://cdn.staticfile.org/twitter-bootstrap/4.4.1/js/bootstrap.min.js" ></script>
<script  src="/js/debouncer.js" ></script>
<script  src="/js/main.js" ></script>

<!-- Plugins -->


  
    <script  src="/js/lazyload.js" ></script>
  



  



  <script defer src="https://cdn.staticfile.org/clipboard.js/2.0.6/clipboard.min.js" ></script>
  <script  src="/js/clipboard-use.js" ></script>



  <script defer src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" ></script>





  <script  src="https://cdn.staticfile.org/tocbot/4.11.1/tocbot.min.js" ></script>
  <script>
    $(document).ready(function () {
      var boardCtn = $('#board-ctn');
      var boardTop = boardCtn.offset().top;

      tocbot.init({
        tocSelector: '#tocbot',
        contentSelector: '#post-body',
        headingSelector: 'h1,h2,h3,h4,h5,h6',
        linkClass: 'tocbot-link',
        activeLinkClass: 'tocbot-active-link',
        listClass: 'tocbot-list',
        isCollapsedClass: 'tocbot-is-collapsed',
        collapsibleClass: 'tocbot-is-collapsible',
        collapseDepth: 0,
        scrollSmooth: true,
        headingsOffset: -boardTop
      });
      if ($('.toc-list-item').length > 0) {
        $('#toc').css('visibility', 'visible');
      }
    });
  </script>



  <script  src="https://cdn.staticfile.org/typed.js/2.0.11/typed.min.js" ></script>
  <script>
    var typed = new Typed('#subtitle', {
      strings: [
        '  ',
        "docker核心原理&nbsp;",
      ],
      cursorChar: "_",
      typeSpeed: 70,
      loop: false,
    });
    typed.stop();
    $(document).ready(function () {
      $(".typed-cursor").addClass("h2");
      typed.start();
    });
  </script>



  <script  src="https://cdn.staticfile.org/anchor-js/4.2.2/anchor.min.js" ></script>
  <script>
    anchors.options = {
      placement: "right",
      visible: "hover",
      
    };
    var el = "h1,h2,h3,h4,h5,h6".split(",");
    var res = [];
    for (item of el) {
      res.push(".markdown-body > " + item)
    }
    anchors.add(res.join(", "))
  </script>



  <script  src="/js/local-search.js" ></script>
  <script>
    var path = "/local-search.xml";
    var inputArea = document.querySelector("#local-search-input");
    inputArea.onclick = function () {
      searchFunc(path, 'local-search-input', 'local-search-result');
      this.onclick = null
    }
  </script>



  <script  src="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.js" ></script>
  <link  rel="stylesheet" href="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.css" />

  <script>
    $('#post img:not(.no-zoom img, img[no-zoom]), img[zoom]').each(
      function () {
        var element = document.createElement('a');
        $(element).attr('data-fancybox', 'images');
        $(element).attr('href', $(this).attr('src'));
        $(this).wrap(element);
      }
    );
  </script>















</body>
</html>
